/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.util;

import com.camachosanchez.bean.ControlReencauche;
import com.camachosanchez.bean.DetalleInspeccionEquipo;
import com.camachosanchez.bean.Egresos;
import com.camachosanchez.bean.Ejes;
import com.camachosanchez.bean.FuncionEje;
import com.camachosanchez.bean.InsumosDespinche;
import com.camachosanchez.bean.TipoAngulo;
import com.camachosanchez.bean.TiposEje;
import com.camachosanchez.bean.TiposVehiculo;
import com.camachosanchez.bean.Usuarios;
import com.camachosanchez.bean.Vehiculos;
import java.awt.Point;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

/**
 *
 * @author Rolando
 */
public class SQLUtil {

    public static Point numeroEjes(int idTipoEje) {
        Point p = new Point();
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            Statement st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT num_neumaticos FROM ejes where id_eje=" + idTipoEje);
            int numNeumaticos = 0;
            int numEjes = 0;
            while (rs.next()) {
                numNeumaticos += rs.getInt("num_neumaticos");
                numEjes++;
            }
            rs.close();
            st.close();
            cn.close();
            p.setLocation(numEjes, numNeumaticos);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return p;
    }
    
    public static FuncionEje buscarPorNombreFuncionEje(String nombre) {
        try {
            Query q = JPAUtil.getEntityManagerFactory().createEntityManager().createNamedQuery("FuncionEje.findByNombre");
            q.setParameter("nombre", nombre);
            List<FuncionEje> funciones = q.getResultList();
            if (!funciones.isEmpty()) {
                return funciones.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static TipoAngulo buscarPorNombreAngulo(String nombre) {
        try {
            Query q = JPAUtil.getEntityManagerFactory().createEntityManager().createNamedQuery("TipoAngulo.findByNombre");
            q.setParameter("nombre", nombre);
            List<TipoAngulo> angulos = q.getResultList();
            if (!angulos.isEmpty()) {
                return angulos.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static InsumosDespinche buscarPorNombreInsumo(String nombre) {
        try {
            Query q = JPAUtil.getEntityManagerFactory().createEntityManager().createNamedQuery("InsumosDespinche.findByNombre");
            q.setParameter("nombre", nombre);
            List<InsumosDespinche> insumos = q.getResultList();
            if (!insumos.isEmpty()) {
                return insumos.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static List<ControlReencauche> obtenerEnviosAReencaucheNoRecepcionados() {
        List<ControlReencauche> lista = null;
        try {
            Query q = JPAUtil.getEntityManagerFactory().createEntityManager().createNamedQuery("ControlReencauche.findByFechaRecepcionNull");
            q.setParameter("estado", true);//lista los que aún no han sido cancelados
            lista = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return lista;
        }
    }
    
    public static List<DetalleInspeccionEquipo> obtenerDetalleInspeccionSalida(int idInspeccion) {
        List<DetalleInspeccionEquipo> lista = null;
        try {
            Query q = JPAUtil.getEntityManagerFactory().createEntityManager().createNamedQuery("DetalleInspeccionEquipo.findByIdInspeccionEquipo");
            q.setParameter("idInspeccion", idInspeccion);
            q.setParameter("tipo", false);
            lista = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return lista;
        }
    }
    
    public static int obtenerMaximoIdInspeccion(){
        int id = 0;
        try {
            Connection cn = ConexionSQL.obtenerConexion();
            Statement st = cn.createStatement();
            ResultSet rs = st.executeQuery("SELECT (IFNULL(MAX(d.id),0)) AS Id FROM inspeccion_equipo d");
            if (rs.first()) {
                id = rs.getInt(1);
            }
            rs.close();
            st.close();
            cn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return id;
    }
    
    public static List<TiposEje> getTiposEjesIgualesXTipoVehiculo(TiposEje tipo,TiposVehiculo tipoV){
        List<TiposEje> tiposTemp = new ArrayList<TiposEje>();
        List<TiposEje> tipos = new ArrayList<TiposEje>();
        EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            Query q = em.createQuery("SELECT T FROM TiposEje T "
                                + "WHERE T.idTipoVehiculo.id = :idTipoV AND T.estado = 1 AND T.activo = 1");
            q.setParameter("idTipoV", tipoV.getId());
            tiposTemp = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        List<Ejes> ejesTipo = tipo.getEjesList();
        for(TiposEje item : tiposTemp){
            List<Ejes> ejes = item.getEjesList();
            Boolean agregar = true;
            if(ejes.size() == ejesTipo.size()){//comprobamos si tienen la misma cantidad de ejes   
                int i = 0;
                for(Ejes eje : ejes){
                    Ejes tmp = ejesTipo.get(i);
                    if(!eje.getIdFuncion().equals(tmp.getIdFuncion()) || !eje.getNumNeumaticos().equals(tmp.getNumNeumaticos()) || eje.getPosicion() != tmp.getPosicion()){
                        agregar = false;
                    }
                    i++;
                }
                if(agregar){
                    tipos.add(item);
                }
            }
        }
        if(tiposTemp.isEmpty() && tipoV.equals(tipo.getIdTipoVehiculo())){
            tipos.add(tipo);
        }
        return tipos;
    }
    
    public static Boolean existeModeloEjeAsignado(int id){
        EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            Query q = em.createQuery("SELECT V FROM Vehiculos V "
                                + "WHERE V.idTipoEje.id = :id AND V.estado = 1");
            q.setParameter("id", id);
            q.setMaxResults(1);
            List<?> list = q.getResultList();
            if(list != null && !list.isEmpty()){
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    public static Usuarios autenticar(String usuario, String password){
        EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        Usuarios user = null;
        try {
            Query q = em.createQuery("SELECT U FROM Usuarios U "
                                + "WHERE U.nombreAcceso = :usuario  AND U.claveAcceso = :password AND U.estado = 1");
            q.setParameter("usuario", usuario);
            q.setParameter("password", password.getBytes());
            q.setMaxResults(1);
            List<?> list = q.getResultList();
            if(list != null && !list.isEmpty()){
                user = (Usuarios)list.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
            user = null;
        }
        return user;
    }
    
    public static List<Vehiculos> getListaUnidadesXCampo(Vehiculos unidad){
        EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        String sql = "SELECT V FROM Vehiculos V WHERE";
        if(unidad.getPlaca() != null && !unidad.getPlaca().equals("")){
            sql += " V.placa LIKE :placa AND";
        }
        if(unidad.getCodBarras() != null && !unidad.getCodBarras().equals("")){
            sql += " V.codBarras LIKE :codigo AND";
        }
        if(unidad.getIdMarca() != null){
            sql += " V.idMarca.id = :idMarca AND";
        }
        if(unidad.getIdTipo() != null){
            sql += " V.idTipo.id = :idTipo AND";
        }
        if(unidad.getIdTipoEje() != null){
            sql += " V.idTipoEje.id = :idModelo AND";
        }
        sql += " V.estado = 1 ORDER BY V.placa";
        Query q = em.createQuery(sql);
        if(unidad.getPlaca() != null && !unidad.getPlaca().equals("")){
            q.setParameter("placa", "%" + unidad.getPlaca() + "%");
        }
        if(unidad.getCodBarras() != null && !unidad.getCodBarras().equals("")){
            q.setParameter("codigo", "%" + unidad.getCodBarras() + "%");
        }
        if(unidad.getIdMarca() != null){
            q.setParameter("idMarca", unidad.getIdMarca().getId());
        }
        if(unidad.getIdTipo() != null){
            q.setParameter("idTipo", unidad.getIdTipo().getId());
        }
        if(unidad.getIdTipoEje() != null){
            q.setParameter("idModelo", unidad.getIdTipoEje().getId());
        }
        return q.getResultList();
    }
    
    public static List<Egresos> getListaEgresos(Date fechaIni, Date fechaFin, short tipo, int idPiloto, int idUnidad){
        java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
        EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        String sql = "SELECT E FROM Egresos E "
                + "WHERE E.fecha <= :fechaFin AND E.fecha >= :fechaIni AND E.anulado = :anulado ";
        if(tipo != 0){
            sql += "AND E.tipo = :tipo ";
        }
        if(idUnidad != 0){
            sql += "AND E.idVehiculos.id = :idUnidad ";
        }
        if(idPiloto != 0) {
            sql += "AND E.idPilotos.id = :idPiloto ";
        }
        sql += "ORDER BY E.fecha";
        
        Query q = em.createQuery(sql);
        q.setParameter("fechaIni", sqlFechaIni);
        q.setParameter("fechaFin", sqlFechaFin);
        q.setParameter("anulado", false);
        if(tipo != 0){
            q.setParameter("tipo", tipo);
        }
        if(idUnidad != 0){
            q.setParameter("idUnidad", idUnidad);
        }
        if(idPiloto != 0) {
            q.setParameter("idPiloto", idPiloto);
        }
        List<Egresos> lista = q.getResultList();
        return lista;
    }
}
